#ifndef _BSL_STRING_H_
#define _BSL_STRING_H_

/*
 Func: 基本服务库，字符串处理
 Date: 2017/03/02
*/

#include <string>
#include <vector>


namespace BSL
{
    /*
    @brief  替换字符串中的字符
    @param [inout]  pszStr  要修改的字符串
    @param [in]     dst     替换的字符
    @param [in]     src     被替换的字符
    @retval  返回替换的个数，小于0出错
    */
    int bsl_replace_char(char *pszStr, char dst, char src);

    /*
    @brief  查找字符串
    @param [in]     src     被查找的字符串
    @param [in]     dst     需要找的字符串
    @param [in]     pos     开始位置
    @retval  返回找到的位置，小于0表示没找着
    */
    int bsl_find_str(const char *src, const char *dst, const unsigned int pos = 0);

    /*
    @brief  分割字符串
    @param [in]     str     被分割的字符串
    @param [in]     symbol  分割符
    @param [inout]  out     分割结果
    @retval  返回解析出来的个数
    */
    int bsl_split_str(const char *str, const char *symbol, char** out);

    /*
    @brief  分割字符串--操作对象string
    @param [IN]  src        被分割的字符串
    @param [IN]  dst        分割结果
    @param [IN]  symbol     分割符号
    */
    int bsl_split_str(std::string src,
                      std::vector<std::string> &dst,
                      const char symbol);

    /*
    @brief  分割带转意字符的字符串
    @param [in]     str     被分割的字符串
    @param [in]     symbol  分割符
    @param [inout]  out     分割结果
    @retval  返回解析出来的个数
    */
    int bsl_split_str_with_escape(const char *str, const char symbol, char** out);

    /*
    @brief  分割字符串中的数字 无符号8bit
    */
    int bsl_split_uint8_from_str(const char *str,
                                 const char *symbol,
                                 unsigned char arr[],
                                 unsigned int size);

    /*
    @brief  分割字符串中的数字 无符号32bit
    */
    int bsl_split_uint32_from_str(const char *str,
                                  const char *symbol,
                                  unsigned int arr[],
                                  unsigned int size);

    /*
    @brief  分割字符串中的数字 有符号64bit
    */
    int bsl_split_int64_from_str(const char *str,
                                 const char *symbol,
                                 long long arr[],
                                 unsigned int size);

    /*
    @brief  分割字符串，忽略连续的分隔符
    @param [out]    out     分割结果，单个结果长度不能大于32
    @param [in]     str     被分割的字符串
    @param [in]     symbol  分割符
    @retval  分割后得到的字符串个数，小于0出错
    */
    int bsl_split_str_32(char out[][32], const char *str, const char symbol);

    /*
    @brief  整理字符串
    @param [inout]  str     需要整理的字符串
    @retval  
    */
    void bsl_trim(char *str);

    /*
    @brief  判断是否是空格类的字符 包括各种制表符
    @param [in]     c       需要判断的字符
    @retval  结果
    */
    bool bsl_is_space(char c);

    /*
    @brief  计算utf-8编码下字符个数
    @param [in]     str     需要计算的字符串
    @retval  个数
    */
    int bsl_utf8_str_len(const char *str);

    /*
    @brief  计算utf-8编码下实际可见的字符个数
    @param [in]     str     需要计算的字符串
    @retval  个数
    */
    int bsl_utf8_char_cnt(const char *str);

    /*
    @brief  url解码
    */
    unsigned char bsl_utf8_char_off_len(unsigned char bChar);

    int char_to_int(char* pChar);

    /*
    @brief  url解码
    */
    int bsl_url_decode(char *pOut, size_t uLen, const char *pData);

    /*
    @brief  url编码
    */
    int bsl_url_encode(char *pOut, size_t uLen, const char *pData);

    /*
    @brief  从url中获取value，返回value长度
    */
    int bsl_get_value_from_url(char *szValue,
                               unsigned int uValueLen,
                               const char *szUrl,
                               const char *szKey);

    /*
     @brief  字符串计数
    */
    int bsl_calc_char_cnt(char *str, char key);

    /*
     @brief  对字符串特定字符转意
    */
    int bsl_turn_specific_char(char *dst, unsigned int len, const char *src, const char symbol);

    /*
     @brief  恢复转义过的字符串
    */
    int bsl_turn_back_specific_char(char *dst, unsigned int len, const char *src);

    /*
    @brief  字符串ip转整数ip
    */
    unsigned int bsl_ip_str_2_num(const std::string &szIp);

    /*
    @brief  整数ip转字符串ip
    */
    std::string bsl_ip_num_2_str(unsigned int uIp);

    /*
    @brief  3\4位版本判断
    @retval =0 表示版本一致
            <0 表示szVer1版本小于szVer2
            >0 表示szVer1版本大于szVer2
    */
    int bsl_cmp_ver(std::string szVer1, std::string szVer2);

    //判断是否有emoji
    bool bsl_utf8_have_emoji(const char *str);

    //获取当前版本对应的转换数值
    unsigned int bsl_get_ver_num(std::string szVer);
}



#endif